package com.christina.engine.strategy.model;

import com.christina.engine.context.model.UserContext;
import com.christina.engine.context.model.ConversationContext;
import com.christina.engine.intent.model.Intent;
import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * 路由上下文
 * 包含路由决策所需的所有信息
 * 
 * @author Christina
 */
@Data
@Builder
public class RoutingContext {
    
    /**
     * 用户上下文
     */
    private UserContext userContext;
    
    /**
     * 对话上下文
     */
    private ConversationContext conversationContext;
    
    /**
     * 识别的意图
     */
    private Intent intent;
    
    /**
     * 原始请求内容
     */
    private String originalRequest;
    
    /**
     * 请求时间
     */
    private LocalDateTime requestTime;
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 请求参数
     */
    private Map<String, Object> parameters;
    
    /**
     * 扩展属性
     */
    private Map<String, Object> attributes;
    
    /**
     * 请求优先级
     */
    private Integer priority;
    
    /**
     * 是否为紧急请求
     */
    private Boolean urgent;
    
    /**
     * 客户端信息
     */
    private String clientInfo;
    
    /**
     * 请求来源
     */
    private String requestSource;
    
    /**
     * 获取参数值
     * 
     * @param key 参数键
     * @param defaultValue 默认值
     * @param <T> 参数类型
     * @return 参数值
     */
    @SuppressWarnings("unchecked")
    public <T> T getParameter(String key, T defaultValue) {
        if (parameters == null) {
            return defaultValue;
        }
        Object value = parameters.get(key);
        return value != null ? (T) value : defaultValue;
    }
    
    /**
     * 获取属性值
     * 
     * @param key 属性键
     * @param defaultValue 默认值
     * @param <T> 属性类型
     * @return 属性值
     */
    @SuppressWarnings("unchecked")
    public <T> T getAttribute(String key, T defaultValue) {
        if (attributes == null) {
            return defaultValue;
        }
        Object value = attributes.get(key);
        return value != null ? (T) value : defaultValue;
    }
    
    /**
     * 检查是否包含指定参数
     * 
     * @param key 参数键
     * @return 是否包含
     */
    public boolean hasParameter(String key) {
        return parameters != null && parameters.containsKey(key);
    }
    
    /**
     * 检查是否包含指定属性
     * 
     * @param key 属性键
     * @return 是否包含
     */
    public boolean hasAttribute(String key) {
        return attributes != null && attributes.containsKey(key);
    }
}